home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / COMPRESS.D < prev    next >
Encoding:
Modula Definition  |  1989-10-08  |  3.8 KB  |  105 lines

  1. DEFINITION MODULE Compressions;
  2.  
  3. FROM    SYSTEM  IMPORT  ADDRESS;
  4.  
  5.  
  6. CONST   DestOverhead = 6L;
  7.         (*
  8.          * Um soviel Bytes sollte der Kodierungs-Puffer größer als der
  9.          * Ausgangspuffer sein, damit die Komprimierung nicht fehlschlagen
  10.          * kann.
  11.          *)
  12.  
  13. PROCEDURE Encode (    type:      CARDINAL;
  14.                       source:    ADDRESS;
  15.                       sourceLen: LONGCARD;
  16.                       dest:      ADDRESS;
  17.                       destLen:   LONGCARD;
  18.                   VAR codeLen:   LONGCARD );
  19.   (*
  20.    * Komprimiert beliebige Daten
  21.    *
  22.    * Eingabe:
  23.    *  'type':      Bei Null wird die optimale Komprimierung ausgesucht (bisher
  24.    *               nur LZW), ist sie Eins, wird eine Lempel-Ziv-Welch-Kodierung
  25.    *               vorgenommen, sonst wird wie bei Null vorgegangen.
  26.    *  'source':    Adresse der Originaldaten
  27.    *  'sourceLen': Länge der Originaldaten
  28.    *  'dest':      Zieladresse für komprimierte Daten
  29.    *  'destLen':   Länge des Puffers für komprimierte Daten, muß um Sechs
  30.    *               größer sein, damit Komprimierung IMMER erfolgreich ist.
  31.    *               Bei der Kodierung wird keinesfalls über diesen Puffer
  32.    *               hinausgeschrieben.
  33.    * Rückgabe:
  34.    *  'codeLen':   Länge der komprimierten Daten, egal, ob sie in den Puffer
  35.    *               passen oder nicht. Ist 'codeLen' Null oder größer als
  36.    *               'destLen', sind die Daten im dest-Puffer nicht gültig.
  37.    *               Dies kann nur passieren, wenn 'destLen' nicht um Sechs
  38.    *               größer als 'sourceLen' ist.
  39.    *
  40.    * Sonderfall:
  41.    *  Ist 'dest' NIL oder 'destLen' Null, wird keine Komprimierung
  42.    *  vorgenommen, 'codeLen' enthält dann trotzdem die theoritische
  43.    *  Länge der komprimierten Daten.
  44.    *
  45.    * Ist die Komprimierung erfolgreich, werden im komprimierten Code
  46.    * die Informationen über dessen Komprimierungsart und Originallänge
  47.    * abgelegt.
  48.    *)
  49.  
  50. PROCEDURE GetInfo (     code:   ADDRESS;
  51.                     VAR type:   CARDINAL;
  52.                     VAR length: LONGCARD );
  53.   (*
  54.    * Eingabe:
  55.    *   'source': Puffer der mit 'Encode' kodierten Daten.
  56.    * Rückgabe:
  57.    *   'type': 0 -> nicht komprimiert
  58.    *           1 -> Lempel-Ziv-Welch-Kodierung
  59.    *   'length': Originallänge
  60.    *)
  61.  
  62. PROCEDURE Decode (    code:    ADDRESS;
  63.                       codeLen: LONGCARD;
  64.                       orig:    ADDRESS;
  65.                       origLen: LONGCARD;
  66.                   VAR success: BOOLEAN );
  67.   (*
  68.    * Dekomprimiert die Daten wieder.
  69.    * Es muß noch mind. 8 KB Speicher frei sein!
  70.    *
  71.    * Eingabe:
  72.    *   'code': Adresse der kodierten Daten
  73.    *   'codeLen': Länge der kodierten Daten
  74.    *   'orig': Zieladresse für Originaldaten
  75.    *   'origLen': Vermeintliche Länge der Originaldaten
  76.    *              (kann von 'sourceLen'-Parameter bei 'Encode' übernommen
  77.    *               oder über 'GetInfo' ermittelt werden).
  78.    * Rückgabe:
  79.    *   'success': Wenn 'origLen' nicht mit der internen Information
  80.    *              übereinstimmt oder wenn ein unbekannter Koprimierungs-
  81.    *              algorithmus verwendet wurde, liefert 'success' FALSE,
  82.    *              sonst TRUE.
  83.    *)
  84.  
  85. (*
  86.  * Beispiel:
  87.  *
  88.  *   (* Zuerst die Daten komprimieren *)
  89.  *   (* 'data' zeigt auf die Daten im Speicher, 'len' ist ihre Länge *)
  90.  *   destLen:= len + DestOverhead;
  91.  *   ALLOCATE (destData, destLen);
  92.  *   Encode (0, data, len, destData, destLen, codeLen);
  93.  *   (* Hierbei kann kein Fehler aufgetreten sein *)
  94.  *   (* Der Code ist nun 'codeLen' Bytes lang *)
  95.  *
  96.  *   Der Code kann abgespeichert werden...
  97.  *
  98.  *   (* Nun wieder dekomprimieren *)
  99.  *   GetInfo (destData, len);
  100.  *   Decode (destData, destLen, data, len, ok);
  101.  *   IF NOT ok THEN Fehler END;
  102.  *)
  103.  
  104. END Compressions.
  105.